글씨 작성 테스트

텐서 플로우는 총 3개의 자료형을 사용한다.
하나는 placeholder라고 한다. 이걸 자료형이라고 하기에는 좀 그렇지만 일단
자료형이라 하자 이 placeholder에 객체라든가 데이터를 담을 수 있다.
그 다음은 Variable라는 것이 있다.
그 다음은 Constant라는 것이 있다.


In [5]:
import tensorflow as tf
print(tf.__version__)


1.2.0

In [6]:
"""
플레이스 홀더라는 것은 그래프를 만들지 않는다.
플레이스 홀더는 하나의 메서드 같은 형태이다.

인풋데이터 넘파이로 넘어오는 데이터를 플레이스 홀더의 텐서로 매핑 시킬때 사용한다. 
"""

placeholder = tf.placeholder(dtype=tf.float32, shape=(3,3))  #shape를 적어줄때 리스트로 해줘도 된다. shape = [3,3]

In [7]:
"""
Variable는 객체의 형태 이다. 
보통 weight를 저장할때 Variable를 사용한다. 
dtype는 안써줘도 되는데 placeholder은 무조건 써줘야 한다. 그래서 그냥 일관성있게 써준다. 
"""
variables = tf.Variable([1,2,3,4,5], dtype=tf.float32)

In [8]:
"""
상수 이다. 절대 안 변하는 것을 선언할때 사용한다. 
dtype는 안써줘도 된다. 
"""
constant = tf.constant([10,20,30,40,50], dtype=tf.float32) #이 constant가 하나의 그래프 이다.

텐서 플로가 기본적으로 돌아갈때는 파이썬 레벨에서는 연산을 절대 허용하지 않는다.
print(placeholder)을 하면 파이썬 상에선 절때 placeholder에 실제 값을 볼 수 없다.
메타 정보만 나온다. 실제 볼려면 session을 사용해야 한다.

텐서플로는 모든 수식을 그래프로 표현을 하는데 표현된 그래프를 연산을 시킨다. 연산을 하기위해 참여하는 그래프가 돌고 있는 걸 세션이라한다.
이 세션이 하나의 디바이스(CPU or GPU)에 올려지게 된다. 그래서 이세션은 파이썬 레벨이선 제어 할 수 없다.


In [13]:
#세션은 일종의 파일이다. 파일이라 생각해도 된다. 파일형태로 쓰고 닫을 수 있다라고 생각하고 코딩하면 된다. 실제로도 파일 입출력을 가지고 세션을 열었다 닫는다.


sess = tf.Session() #이렇게 하면 세션이 열린 것이다. 이렇게 하면 세션에 그래프를 담을 수 있다. 
result = sess.run(constant)
print(result)
sess.close()


[ 10.  20.  30.  40.  50.]

In [16]:
a = tf.constant([5], dtype=tf.float32)
b = tf.constant([10], dtype=tf.float32)
c = tf.constant([2], dtype=tf.float32)

d = a * b + c  #이렇게 한걸 모델을 만들었다라고 한다. 그리고 이걸 실행 시킬려면 이d를 run을 시켜줘야 한다. 

print(d) #현재 상태에선 그냥 텐서이다. 즉 그래프만 만들어 놓은거지 아직 디바이스로 보내지 않았기 때문에 아무것도 아니다.


Tensor("add_3:0", shape=(1,), dtype=float32)

In [17]:
sess = tf.Session()
result = sess.run(d)
print(result)
sess.close()


[ 52.]

In [20]:
#Variable는 constant랑 그래프가 그려지는게 다르다. 
#Variable는 weight를 담아놓는 공간이다. weight는 초기화가 필요하다. 
#즉 Varible는 반드시 초기화가 필요 한다. 
#초기화를 한다는 것은 Variable는 최초에 비어있는 형태로 그래프가 구성되어지는데 initial을 해줄때 비로서 5 나 3이나 2와 같은 지정된 값이 적용이된다. 
#initial을 안해주면 연산을 해야하는 값들이 없기 떼문에 에러가 발행 하는 것이다. 
#constant는 이게 필요가 없다. 상수이기 때문?

var1 = tf.Variable([5])
var2 = tf.Variable([3])
var3 = tf.Variable([2])

var4 = var1 * var2 + var3   #Variable는 이렇게하고 나서 run하면 에러난다. 초기화를 해주고나서 해야한다. 
 
print(var4)


Tensor("add_5:0", shape=(1,), dtype=int32)

In [22]:
sess = tf.Session()
sess.run(tf.global_variables_initializer())
result = sess.run(var4)
print(result)
sess.close()


[17]

In [25]:
"""
placeholder은 애초에 그래프를 만들지 않는다. 
매핑을 시키는 것이다. 저장을 하는 것이 아니다. 텐서와 데이터를 매핑 시키는 역할을 한다. 
즉 판다스등의 데이터들을 텐서로 매핑해준다. 
그래서 피딩이라는 테크닉을 사용한다. 
피딩은 넘파이 array이나 판다스의 dataframe나 리스트 아무거나 피딩 할 수 있다. 

데이터를 인풋시킬때 placeholder을 사용한다. 인풋이 이미지일 수도 있고 데이터 셋일 수도 있고 

placeholder을 이용해서 데이터를 매핑시키면 그때부턴 이데이터를 텐서라 생각하고 모델을 짜면 된다. 
"""

v1 = 5
v2 = 3
v3 = 2

#이값들을 placeholder에 매핑 할 때에는 키 밸류 형태로 보낸다.
#feed_dict = {키는 ph1 같은 placeholder의 변수, value는 위의 v1같은 값}

ph1 = tf.placeholder( dtype=tf.float32 )
ph2 = tf.placeholder( dtype=tf.float32 )
ph3 = tf.placeholder( dtype=tf.float32 )

result_value = ph1 * ph2 + ph3

feed_dict = {ph1:v1, ph2:v2, ph3:v3}

sess = tf.Session()
result = sess.run(result_value, feed_dict=feed_dict) # feed_dict를 이용해서 값들을 주입해주면 해당 값이 해당 그래프의 위치에 매핑되면서 텐서로 인식된다. 
print(result)
sess.close()


17.0

In [26]:
"""
placeholder을 이용할때의 특징 
image아니 label등이 list이거나 넘파이의 어레이등 서로 싱크가 맞지 않을 수 있다.
텐서플로에서의 연산은 텐서끼리만 가능한데 placeholder을 이용해서 받으면 인풋값들을 텐서로 변환시켜주니 텐서끼리 연산을 할 수 있게 된다.
"""

image = [1,2,3,4,5]
label = [10,20,30,40,50]

ph_image = tf.placeholder( dtype=tf.float32 )
ph_label = tf.placeholder( dtype=tf.float32 )

ph_result = ph_image + ph_label

feed_dict = {ph_image:image, ph_label:label}

sess = tf.Session()
result = sess.run(ph_result, feed_dict=feed_dict)
print(result)
sess.close()

"""
아래의 결과를 보면 텐서로서 계산 결과가 나온다.
원래 리스트끼리 더하면 그냥 연결이 된다 즉 [1,2,3]+[4,5,6]을 하면 
[1,2,3,4,5,6]이 나온다. 그런데 텐서끼리 더하면 [1,2,3]+[4,5,6]=[5,6,7] 가된다. 
placeholder은 리스트등을 텐서로 변환시키기 때문에 텐서 연산을 할 수 있게 한다. 
"""


[ 11.  22.  33.  44.  55.]

In [27]:
list1 = [1,2,3]
list2 = [10,20,30]
print(list1 + list2)


[1, 2, 3, 10, 20, 30]

In [ ]: